package com.hdu.dwh.utils;

import io.jsonwebtoken.*;
import io.jsonwebtoken.impl.crypto.MacProvider;

import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class AppJwtUtil {
    // 使用 HMAC-SHA 算法生成安全密钥
    private static final Key SECRET_KEY = MacProvider.generateKey(SignatureAlgorithm.HS512);
    private static final long EXPIRATION = 86400000; // 24小时

    /**
     * 生成 JWT Token（包含用户ID、用户名和用户类型）
     */
    public static String generateToken(String userId, String username, String userType) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("userId", userId);      // 添加用户ID
        claims.put("username", username);  // 添加用户名字段
        claims.put("userType", userType);  // 使用userType字段名

        return Jwts.builder()
                .setSubject(username)
                .setClaims(claims)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
                .compact();
    }

    /**
     * 解析JWT Token
     */
    public static Claims parseJWT(String token) {
        return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
    }

    /**
     * 验证Token是否有效
     */
    public static boolean validateToken(String token) {
        try {
            parseJWT(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 从Token中解析用户名
     */
    public static String parseUsername(String token) {
        try {
            Claims claims = parseJWT(token);
            return claims.get("username", String.class);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 从Token中解析用户ID
     */
    public static String parseUserId(String token) {
        try {
            Claims claims = parseJWT(token);
            return claims.get("userId", String.class);
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 从Token中解析用户类型
     */
    public static String parseUserType(String token) {
        try {
            Claims claims = parseJWT(token);
            return claims.get("userType", String.class);
        } catch (Exception e) {
            return null;
        }
    }

//    /**
//     * 原有的解析用户名方法（兼容旧代码）
//     */
//    public static String parseToken(String token) {
//        try {
//            return Jwts.parser()
//                    .setSigningKey(SECRET_KEY)
//                    .parseClaimsJws(token)
//                    .getBody()
//                    .getSubject();
//        } catch (JwtException e) {
//            return null;
//        }
//    }
}
